/*!
 * contentloaded.js
 *
 * Author: Diego Perini (diego.perini at gmail.com)
 * Summary: cross-browser wrapper for DOMContentLoaded
 * Updated: 20101020
 * License: MIT
 * Version: 1.2
 *
 * URL:
 * http://javascript.nwbox.com/ContentLoaded/
 * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE
 * github: https://github.com/dperini/ContentLoaded/blob/master/src/contentloaded.js
 *
 */

 // @win window reference 
 // @fn function reference 
 // 参数：win（窗口window），fn（加载完成之后执行的函数） 
function contentLoaded(win, fn) { 
  // 执行完成判断 
  var done = false, 
    top = true, // 判断当前窗口是否在顶层窗口，不是的话报错 
    doc = win.document, 
    root = doc.documentElement, 
    modern = doc.addEventListener, // 高级浏览器和低级浏览器判断变量 
    add = modern ? 'addEventListener' : 'attachEvent', 
    rem = modern ? 'removeEventListener' : 'detachEvent', 
    pre = modern ? '' : 'on', 
    init = function(e) { 
      // 输出执行的事件类型 
      console.log(e.type ? e.type : e); 

      // 输出readystatechange的状态 
      if (e.type == 'readystatechange') { 
        console.log(doc.readyState); 
      } 

      // 保证每个预加载的事件只执行一次fn，包括DOMContentLoaded。但是保证init事件不再在load事件中执行。 
      if (e.type == 'readystatechange' && doc.readyState != 'complete') return; 

      // 将onload同名的加载事件清除掉，防止又执行一次，作者这倒是想的很周到啊 
      (e.type == 'load' ? win : doc)[rem](pre + e.type, init, false); 
      // 下面是DOMContentLoaded或者readystatechange真正完成的时候才会执行，或者更低级浏览器完成时执行 
      if (!done && (done = true)) { 
        console.log('我已经被' + e.type + '执行了'); 
        fn.call(win, e.type || e); 
      } 
    }, 

    poll = function() { 
      // ie7以及以下的浏览器使用doscroll进行模拟domcontentloaded 
      try { 
        root.doScroll('left'); 
      } catch (e) { 
        console.log('低版本浏览器还没有加载完成，继续递归执行至加载完成'); 

        // 因为间隔50毫秒时间还是相对较长的，可能这个时候readystatechange已经提早执行了 
        setTimeout(poll, 50); return; 
      } 

      console.log('加载完成，可以使用readystatechange'); 

      // 下面是保证低级浏览器如果不支持readystatechange的情况下，一定会执行这个init函数 
      init('poll'); 
    }; 

  console.log('doc.readyState');
  console.log(doc.readyState);
  // console.log('modern = ' + modern);
  // 如果文档readyState为complete代表load事件准备被触发，所以这个时候可以直接执行要执行的函数了 
  if (doc.readyState == 'complete') { 
    fn.call(win, 'lazy');
  } else { 
    // 不是最新的浏览器，进行doScroll加载 
    // 可以使用Charles中国年的Throttle Settings来限速实现执行这个函数，我是限速到10kb 
    if (!modern && root.doScroll) { 
      console.log('低版本浏览器执行doScroll！'); 

      // 判断当前窗口是否插入到了iframe窗口，因为这个属性兼容性未知，需要用try防止出错 
      try { top = !win.frameElement; } catch (e) {}

      // 如果当前窗口是以iframe插入到窗口中的，那么应该使用readystatechange 
      if (top) poll(); 
    } 

    console.log('IE9及更高级浏览器的DOMContentLoaded，走你！'); 
    doc[add](pre + 'DOMContentLoaded', init, false); //只有ie9以及更高版本支持 
    console.log('默认走一次的readystatechange'); 
    doc[add](pre + 'readystatechange', init, false); //兼容ie8以及更低的浏览器 
    console.log('默认走一次的onload'); 
    win[add](pre + 'load', init, false); //高级浏览器清除win的onload中执行的函数，IE浏览器清除doc中的onload函数 
  } 
};